package proto

import (
	"bufio"
	"bytes"
	"encoding/binary"
	"fmt"
	"github.com/MingOf/logger"
	"io"
)

var log = logger.NewLogger("Info", "console", 0)

func Encode(msg string) ([]byte, error) {
	msgLen := int32(len(msg)) // 消息长度（占用4个字节）
	pkg := new(bytes.Buffer)
	err := binary.Write(pkg, binary.LittleEndian, msgLen) // 将消息长度写入数据包
	if err != nil {
		fmt.Println(err)
		return nil, err
	}
	err = binary.Write(pkg, binary.LittleEndian, []byte(msg)) //将消息内容写入数据包
	return pkg.Bytes(), nil
}

func Decode(reader *bufio.Reader) (string, error) {
	/**
	1. 获取消息的长度
	2. 通过长度获取消息的内容
	*/
	byteLength, _ := reader.Peek(4)
	var length int32
	var buf = bytes.NewBuffer(byteLength)
	var err error
	var n int
	err = binary.Read(buf, binary.LittleEndian, &length)
	//fmt.Println(length)
	if err != nil {
		log.Error(err)
		return "", err
	}
	var data = make([]byte, 4+length)
	n, err = reader.Read(data)
	if n == 0 {
		fmt.Println("nil data")
		return "", io.EOF
	}
	if err == io.EOF {
		fmt.Println("read complete")
		return "", io.EOF
	}
	if err != nil {
		fmt.Println(err)
		return "", err
	}
	//buffLength := bytes.NewBuffer(byteLength)
	return string(data), nil
}

//func Decode(reader *bufio.Reader) (string, error) {
//	// 读取消息的长度
//	lengthByte, _ := reader.Peek(4) // 读取前4个字节的数据
//	lengthBuff := bytes.NewBuffer(lengthByte)
//	var length int32
//	err := binary.Read(lengthBuff, binary.LittleEndian, &length)
//	if err != nil {
//		return "", err
//	}
//	// Buffered返回缓冲中现有的可读取的字节数。
//	if int32(reader.Buffered()) < length+4 {
//		return "", err
//	}
//
//	// 读取真正的消息数据
//	pack := make([]byte, int(4+length))
//	_, err = reader.Read(pack)
//	if err != nil {
//		return "", err
//	}
//	return string(pack[4:]), nil
//}
